﻿using System.Text.RegularExpressions;

using Tszy.Unlimited.Base.Collections;

namespace Tszy.Unlimited.Base.Extensions;

/// <summary>
/// URL 字符串扩展。
/// </summary>
public static class UrlExtensions
{
    /// <summary>
    /// 验证 Web URL 的正则表达式。
    /// </summary>
    private static readonly Regex _webUrlExpression = new(@"(http|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", RegexOptions.Singleline | RegexOptions.Compiled);

    /// <summary>
    /// 是否 URL。
    /// </summary>
    /// <param name="target">当前字符串。</param>
    /// <returns>是否 URL。</returns>
    public static bool IsUrl(this string target)
    {
        return !string.IsNullOrWhiteSpace(target) && _webUrlExpression.IsMatch(target);
    }

    /// <summary>
    /// 从指定的 URL 中，截取出参数。
    /// </summary>
    /// <param name="source">URL。</param>
    /// <returns>URL 参数字典。</returns>
    /// <exception cref="ArgumentException"></exception>
    public static UrlDictionary GetUrlParameterByUrl(this string source)
    {
        if (!IsUrl(source))
            throw new ArgumentException("这不是一个有效的 URL。");

        var uri = new Uri(source);

        //var parameters = source.Contains('?') ? source.TrimStart("?") : source.TrimEnd("/") ?? string.Empty;
        var parameters = uri.Query;

        return parameters.GetUrlParameterByString();
    }

    /// <summary>
    /// 将 URL 参数转换成字典形式（KEY会自动转换成小写字母的形式）。
    /// </summary>
    /// <remarks>
    /// 例：
    /// ?userId=1
    /// =>
    /// key:userId
    /// value:1
    /// 1.其中，“?”可要可不要。
    /// 2.key 是以小写字母的形式。
    /// </remarks>
    /// <param name="source">URL 参数。</param>
    /// <returns></returns>
    public static UrlDictionary GetUrlParameterByString(this string source)
    {
        var parameters = new UrlDictionary();

        if (!string.IsNullOrWhiteSpace(source))
        {
            var dataArray = source.TrimStart('?').Trim('&').Split('&');

            if (dataArray.Length > 0)
            {
                foreach (var item in dataArray)
                {
                    if (!string.IsNullOrWhiteSpace(item))
                    {
                        var itemArray = item.Split('=');

                        if (itemArray.Length == 2)
                        {
                            var key = itemArray[0] ?? string.Empty;
                            var value = itemArray[1] ?? string.Empty;

                            if (!string.IsNullOrWhiteSpace(key))
                            {
                                if (!parameters.ContainsKey(key))
                                    parameters.Add(key, value);
                            }
                        }
                    }
                }
            }
        }

        return parameters;
    }

    /// <summary>
    /// 组装 URL。
    /// </summary>
    /// <param name="source">当前域名。</param>
    /// <param name="path">相对路径 URL。</param>
    /// <returns></returns>
    public static string CombineUrl(this string source, string path)
    {
        source ??= string.Empty;
        path ??= string.Empty;
        return source.TrimEnd('/') + "/" + path.TrimStart('/');
    }
}
